package cn.wit.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.management.RuntimeErrorException;

import org.junit.Test;

import cn.wit.luohui.day08.Employee;



public class DemoGeneric {

	public static void main(String[] args) {
		
	}
	
	@Test
	public void test() {
		
		List list = new ArrayList();
		
		list.add(1L);
		list.add("abc");
		list.add(true);
		
		
		//List<String>参数化类型，String类型参数
		List<String> list1 = new ArrayList<>();
		list1.add("abc");
		
		//不需要转型，简化代码书写
		String string = list1.get(0);
		System.out.println(string);
		
	}
	@Test
	public void test1() {
		List<String> list =Arrays.asList("aaa");
	}
	
	//限定集合里面只有String
	public void foo(List<String> list) {
		
	}
	
	@Test
	public void test3() {
		System.out.println(max(3.0,4,5,6.0));
	}
	
	@Test
	public void test4() {
		List<String> list = new ArrayList<>();
		list.add("java");
		list.add("C++");
		list.add("abc");
		
		//自定义，通过长度去返回自己想要的结果
		Collections.sort(list,new Comparator<CharSequence>() {

			@Override
			public int compare(CharSequence o1, CharSequence o2) {
				// TODO Auto-generated method stub
				return o1.length()-o2.length();
			}

		});
		
		for(String e:list) {
			System.out.println(e);
		}
	}
	
	//求多个整数最大值,泛型方法
	public static <T extends Number> T max(T... numbers) {
		
		T max = numbers[0];
		
		//边界判断
		if(numbers[0].doubleValue()==0) {
			//抛出异常
			throw new RuntimeException("参数不能为空");
		}
		
		for(int i =0;i<numbers.length;i++) {
			if(max.doubleValue()<numbers[i].doubleValue()) {
				max = numbers[i];
			}
		}
		return max;
	}
	
	/**
	 * 返回Employee信息，也返回部门信息
	 * 
	 */
//	
//	public static Pair<Employee,Department> findEmployee(int id){
//		返回后，里面也有get，set方法，方便别人操作
//		return new Pair(new Employee(),new Department());
//	}
//	
//	static class Pair<T,D>{
//		private T e;
//		private D d;
//		
//		public Pair() {
//			this.d=d;
//			this.e=e;
//		}
//		
//		public T getE() {
//			return e;
//		}
//		public void setE(T e) {
//			this.e = e;
//		}
//		public D getD() {
//			return d;
//		}
//		public void setD(D d) {
//			this.d = d;
//		}
		
//	}
}
